package com.baby.simple;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {

    public static void main(String[] args) throws Exception {
        //1.设置一个连接工厂
        ConnectionFactory connectionFactory =new ConnectionFactory();
        //2.设置连接信息
        connectionFactory.setHost("192.168.247.132");
        connectionFactory.setPort(5772);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("123");
        connectionFactory.setVirtualHost("/");
        //3.通过连接工厂获取一个连接对象Connection
        Connection connection = connectionFactory.newConnection();
        //4.通过连接对象获取通道
        Channel channel = connection.createChannel();
        //5.通过channel通道从队列中获取消息
        /*************************************************
         String queue, boolean autoAck, Consumer callback
         第一个参数：queue，表示队列名称
         第二个参数：autoAck：是否自动确认，设置true
         第三个参数：表示消费者对象，通常消费的业务逻辑可以写在这里
         ************************************************/
        DefaultConsumer consumer = new DefaultConsumer(channel){
        // ctrl+o  重写方法
            /*************************************************
             consumerTag:表示消费者唯一标识符
             envelope:封装了交换机、路由，每条消息的唯一标识符相关信息
             properties:对应着消息本身的属性,和生产者一端设置的消息本身的属性对应。
             body:消息本身
             ************************************************/
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("消费者唯一标识："+consumerTag);
                System.out.println("交换机相关信息："+envelope.getExchange());
                System.out.println("路由key："+envelope.getRoutingKey());
                System.out.println("消息唯一标识："+envelope.getDeliveryTag());

                System.out.println("消息本身："+new String(body));

                //手动确认，第一个参数:消息的唯一标识符。第二个参数：multiple,是否需要多个消费者都和rabbitmq进行确认
                channel.basicAck(envelope.getDeliveryTag(),true);
            }
        };

        channel.basicConsume("mirror_simple_queue", false,consumer);
        //6。释放连接（一般不用，因为他会时刻从消息队列拿数据）

    }
}
